﻿namespace wwl.Contract.Enums
{
  /// <summary>
  /// 自定义错误代码枚举。
  /// 1. 错误码分类说明
  /// 1000系列：客户端输入问题，用户可自行修复
  /// 2000系列：业务逻辑冲突，需要用户调整操作
  /// 3000系列：资源状态问题，需要检查数据状态
  /// 4000系列：外部依赖问题，通常需要重试
  /// 5000系列：系统内部问题，需要管理员介入
  /// 6000-8000系列：具体业务模块的特殊错误
  /// 2. 扩展预留空间
  /// 每个分类都预留了足够的编号空间，便于后续扩展：
  /// 参数错误：1001-1099 (99个)
  /// 业务错误：2001-2099 (99个)
  /// 资源错误：3001-3099 (99个)
  /// 系统错误：5001-5099 (99个)
  /// </summary>
  public enum CustomErrorCode
  {
    // ====== 通用基础码 (0) ======

    /// <summary>
    /// 操作成功
    /// </summary>
    /// <remarks>所有业务操作执行成功的场景</remarks>
    Success = 0,

    // ====== 参数相关错误 (1001-1099) ======

    /// <summary>
    /// 必填参数缺失，请检查
    /// </summary>
    /// <remarks>核心参数未传递（如租户编码、名称为空）</remarks>
    Param_Required = 1001,

    /// <summary>
    /// 参数格式无效，请输入正确格式
    /// </summary>
    /// <remarks>参数格式不符合要求（如状态不是 ENABLED/DISABLED）</remarks>
    Param_InvalidFormat = 1002,

    /// <summary>
    /// 参数长度超限，请检查输入
    /// </summary>
    /// <remarks>参数长度超出配置上限（如租户名称超过 128 字符）</remarks>
    Param_LengthExceed = 1003,

    /// <summary>
    /// 参数值超出有效范围
    /// </summary>
    /// <remarks>参数值不在允许区间（如页码为负数）</remarks>
    Param_OutOfRange = 1004,

    /// <summary>
    /// 分页参数无效，请输入有效页码和页大小
    /// </summary>
    /// <remarks>页码≤0 或 页大小≤0 / 超出上限</remarks>
    Param_InvalidPage = 1005,

    /// <summary>
    /// 客户端参数验证失败
    /// （如必填项缺失、格式错误、长度超限等客户端提交的参数不符合规则）
    /// </summary>
    Param_ValidationFailed = 1006,

    // ====== 业务规则错误 (2001-2099) ======

    /// <summary>
    /// 数据已存在，请勿重复提交
    /// </summary>
    /// <remarks>唯一标识重复（如租户编码已被占用）</remarks>
    Business_DuplicateData = 2001,

    /// <summary>
    /// 状态变更不合法，请检查当前状态
    /// </summary>
    /// <remarks>不允许的状态转换（如禁用已删除的租户）</remarks>
    Business_InvalidStatusChange = 2002,

    /// <summary>
    /// 权限不足，无操作权限
    /// </summary>
    /// <remarks>当前用户无该操作权限（如普通用户删除租户）</remarks>
    Business_InsufficientPermission = 2003,

    /// <summary>
    /// 关联数据存在，无法执行操作
    /// </summary>
    /// <remarks>资源下有关联数据（如租户下有用户，无法删除）</remarks>
    Business_RelatedDataExists = 2004,

    // ====== 资源相关错误 (3001-3099) ======

    /// <summary>
    /// 请求的资源不存在
    /// </summary>
    /// <remarks>资源 ID 无效或未查询到数据（如租户 ID 不存在）</remarks>
    Resource_NotFound = 3001,

    /// <summary>
    /// 资源已被删除，无法操作
    /// </summary>
    /// <remarks>资源已逻辑删除（IsDeleted=true）</remarks>
    Resource_Deleted = 3002,

    /// <summary>
    /// 资源被占用，暂无法操作
    /// </summary>
    /// <remarks>资源正在被其他进程使用（如租户正在被编辑）</remarks>
    Resource_Occupied = 3003,

    // ====== 接口/调用错误 (4001-4099) ======

    /// <summary>
    /// 接口调用超时，请稍后重试
    /// </summary>
    /// <remarks>第三方接口或内部服务调用超时</remarks>
    Call_Timeout = 4001,

    /// <summary>
    /// 接口返回数据无效，请联系管理员
    /// </summary>
    /// <remarks>第三方接口返回格式错误或无效数据</remarks>
    Call_InvalidResponse = 4002,

    /// <summary>
    /// 服务调用失败，请稍后重试
    /// </summary>
    /// <remarks>内部服务调用异常（如仓储层操作失败）</remarks>
    Call_ServiceFailed = 4003,

    // ====== 系统错误 (5001-5099) ======

    /// <summary>
    /// 系统异常，请联系管理员
    /// </summary>
    /// <remarks>数据库操作异常（连接失败、SQL 执行错误等）</remarks>
    System_DbError = 5001,

    /// <summary>
    /// 系统异常，请联系管理员
    /// </summary>
    /// <remarks>缓存操作异常（Redis 连接失败、key 过期等）</remarks>
    System_CacheError = 5002,

    /// <summary>
    /// 系统配置错误，请联系管理员
    /// </summary>
    /// <remarks>配置项缺失或无效（如数据库连接字符串错误）</remarks>
    System_ConfigError = 5003,

    /// <summary>
    /// 系统异常，请联系管理员
    /// </summary>
    /// <remarks>未捕获的未知系统异常</remarks>
    System_UnknownError = 5999,

    // ====== 租户模块错误 (6001-6099) ======

    /// <summary>
    /// 租户已冻结，无法执行操作
    /// </summary>
    /// <remarks>租户状态为冻结，限制所有业务操作</remarks>
    Tenant_Frozen = 6001,

    /// <summary>
    /// 租户已过期，请续费
    /// </summary>
    /// <remarks>租户有效期到期，限制操作</remarks>
    Tenant_Expired = 6002,

    // ====== 用户模块错误 (7001-7099) ======

    /// <summary>
    /// 密码错误，请重新输入
    /// </summary>
    /// <remarks>用户登录时密码校验失败</remarks>
    User_WrongPassword = 7001,

    /// <summary>
    /// 账号已锁定，请 15 分钟后重试
    /// </summary>
    /// <remarks>多次密码错误导致账号临时锁定</remarks>
    User_AccountLocked = 7002,

    // ====== 角色模块错误 (8001-8099) ======

    /// <summary>
    /// 角色已分配用户，无法删除
    /// </summary>
    /// <remarks>角色下关联了用户，不允许直接删除</remarks>
    Role_HasUsers = 8001,

    /// <summary>
    /// 系统默认角色，无法修改/删除
    /// </summary>
    /// <remarks>系统预置角色，禁止修改或删除操作</remarks>
    Role_SystemDefault = 8002
  }
}
